package cc.customer.saleHelp.services.Impl;

import cc.customer.common.domain.ResponseBo;
import cc.customer.common.service.impl.BaseService;
import cc.customer.common.utils.Constant;
import cc.customer.common.utils.DateUtil;
import cc.customer.common.utils.Utils;
import cc.customer.saleHelp.dao.CsaleModalMapper;
import cc.customer.saleHelp.domain.CsaleModal;
import cc.customer.saleHelp.services.CsaleModalServices;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import java.util.Date;
import java.util.List;

@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class CsaleModalServicesImpl extends BaseService<CsaleModal> implements CsaleModalServices {

    private static final Logger logger = LoggerFactory.getLogger(CsaleModalServicesImpl.class);

    @Autowired
    private CsaleModalMapper csaleModalMapper;

    @Override
    public ResponseBo addModalGroup(CsaleModal csaleModal) {
        try {
            int num = csaleModalMapper.insert(csaleModal);
            if (num > 0){
                return ResponseBo.ok(csaleModal);
            }
        }catch (Exception e){
            logger.error("新建模板分组失败:"+e.getMessage());
        }
        return ResponseBo.error("新建模板分组失败");
    }

    @Override
    public ResponseBo selectModalList(CsaleModal csaleModal) {
        try {
            Example example = new Example(CsaleModal.class);
            Example.Criteria criteria = example.createCriteria();
            /**是不是企业 或者个人**/
            String cSaleMtype = csaleModal.getcSaleMtype();
            if (!StringUtils.isEmpty(cSaleMtype)){
                if ("0".equals(cSaleMtype)){
                    criteria.andEqualTo("cSaleMtype",cSaleMtype);
                }else{
                    String userUuid = csaleModal.getcSaleUserUuid();
                    criteria.andEqualTo("cSaleMtype",cSaleMtype).andEqualTo("cSaleUserUuid",userUuid);
                }
            }
            criteria.andEqualTo("cSaleGroup","0").andEqualTo("cSaleDelete","1");
            example.setOrderByClause("c_sale_ctime asc");
            List<CsaleModal> listParent = this.selectByExample(example);
            listParent.forEach(list -> {
                Example example2 = new Example(CsaleModal.class);
                example2.createCriteria().andEqualTo("cSaleGroup",list.getcSaleUuid()).andEqualTo("cSaleDelete","1");
                example2.setOrderByClause("c_sale_ctime asc");
                List<CsaleModal> children = this.selectByExample(example2);
                list.setChildrens(children);
            });
            return ResponseBo.ok(listParent);
        }catch (Exception e){
            logger.error("加载用户的模板失败："+e.getMessage());
        }
        return ResponseBo.error();
    }

    @Override
    @Transactional
    public ResponseBo upDownOption(String beforUuid, String afterUuid) {
        try {
            //操作的移动的id
            CsaleModal csbefor = new CsaleModal();
            csbefor.setcSaleUuid(beforUuid);
            csbefor = csaleModalMapper.selectOne(csbefor);
            String befor = csbefor.getcSaleCtime();

            //被移动的id
            CsaleModal csafter = new CsaleModal();
            csafter.setcSaleUuid(afterUuid);
            csafter = csaleModalMapper.selectOne(csafter);
            String after = csafter.getcSaleCtime();
            //交换时间
            csbefor.setcSaleCtime(after);
            csafter.setcSaleCtime(befor);

            this.updateNotNull(csbefor);
            this.updateNotNull(csafter);
            return ResponseBo.ok();
        }catch (Exception e){
            logger.error("销售计划的模板移动失败:"+e.getMessage());
        }
        return ResponseBo.error("移动失败");
    }

    @Override
    @Transactional
    public ResponseBo updateModalInfo(CsaleModal csaleModal) {
        try {
            CsaleModal csbefor = new CsaleModal();
            csbefor.setcSaleUuid(csaleModal.getcSaleUuid());
            csbefor = csaleModalMapper.selectOne(csbefor);
            csaleModal.setcSaleId(csbefor.getcSaleId());
            csaleModal.setcSaleUuid(null);
            this.updateNotNull(csaleModal);
            return ResponseBo.ok();
        }catch (Exception e){
            logger.error("更新销售助手的信息失败:"+e.getMessage());
        }
        return ResponseBo.error();
    }

    @Override
    public ResponseBo selectModalInfo(CsaleModal csaleModal) {
        try {
            JSONObject json = new JSONObject();
            CsaleModal csaleModal1 = csaleModalMapper.selectOne(csaleModal);
            /**解析模板的时间格式**/
            String scaleJson = csaleModal1.getcSaleJson();
            JSONObject jsonscale = new JSONObject();
            if (!StringUtils.isEmpty(scaleJson)){
                jsonscale  = JSONObject.parseObject(scaleJson);
            }
            json.put("modal",csaleModal1);
            json.put("scale",jsonscale);
            return ResponseBo.ok(json);
        }catch (Exception e){
            logger.error("获取模板详细信息失败:"+e.getMessage());
        }
        return ResponseBo.error();
    }

    @Override
    public ResponseBo selectModalByUuid(CsaleModal csaleModal) {
        try {

            Example example = new Example(CsaleModal.class);
            example.createCriteria().andEqualTo("cSaleGroup",csaleModal.getcSaleUuid()).andEqualTo("cSaleDelete","1");
            List<CsaleModal> list = this.selectByExample(example);

            for (CsaleModal modal :list){
                String cSaleTime = modal.getcSaleTime();
                if (!StringUtils.isEmpty(cSaleTime)){
                    String csale = modal.getcSaleJson();
                    if (!StringUtils.isEmpty(csale)){
                        JSONObject json = JSONObject.parseObject(csale);
                        switch (cSaleTime){
                            case Constant.CSALEMODAL_TIME_DAY:
                                String day = json.getString("d");
                                String timer = json.getString("t");
                                modal.setOneParame("第"+day+"天");
                                modal.setTwoParame(timer);
                                break;
                            case Constant.CSALEMODAL_TIME_WEEK:
                                String week = json.getString("wc");
                                String weekw = json.getString("w");
                                String weektimer = json.getString("t");
                                modal.setOneParame("第"+week+"周");
                               String weeeks =  Utils.formatterWeek(weekw);
                                modal.setTwoParame("星期"+weeeks+" "+weektimer);
                                break;
                            case Constant.CSALEMODAL_TIME_MONTH:
                                String month = json.getString("mc");
                                String monthw = json.getString("md");
                                String monthtimer = json.getString("t");
                                modal.setOneParame("第"+month+"月");
                                modal.setTwoParame("第"+monthw+"几天 "+monthtimer);
                                break;
                            case Constant.CSALEMODAL_TIME_HOUR:
                                String hour = json.getString("h");
                                modal.setOneParame("第 "+hour+" 个小时");
                                modal.setTwoParame("");
                                break;
                            default:
                                String tim = json.getString("t");
                                String []str = tim.split(" ");
                                modal.setOneParame(str[0]);
                                modal.setTwoParame(str[1]);
                        }
                    }else{
                        modal.setOneParame("<i class=\"fa fa-ban fa-stack-2x text-danger\"></i>");
                        modal.setTwoParame("");
                        modal.setcSaleDesc("无内容");
                    }
                }else{
                    modal.setOneParame("<i class=\"fa fa-ban fa-stack-2x text-danger\"></i>");
                    modal.setTwoParame("");
                    modal.setcSaleDesc("无内容");
                }
            }
            return ResponseBo.ok(list);
        }catch (Exception e){
            logger.error("根据分组获取模板的列表失败："+e.getMessage());
        }
        return ResponseBo.error();
    }

    @Override
    public ResponseBo selectModalAndPraseTime(String modalUuid) {

        try {
            CsaleModal csaleModal = new CsaleModal();
            csaleModal.setcSaleUuid(modalUuid);

            CsaleModal modal  = csaleModalMapper.selectOne(csaleModal);
            if (modal!=null){
                String cSaleTime = modal.getcSaleTime();
                if (!StringUtils.isEmpty(cSaleTime)) {
                    String csale = modal.getcSaleJson();
                    if (!StringUtils.isEmpty(csale)) {
                        String startTime = paraseModalTime(csale,cSaleTime); //解析模板时间
                        modal.setOneParame(startTime); //指定第一个临时参数设置 具体的时间
                    }
                }
                return  ResponseBo.ok(modal);
            }
        }catch (Exception e){
            logger.error("解析模板详情失败:"+e.getMessage());
        }
        return ResponseBo.error();
    }


    /**解析模板指定时间**/
    private String paraseModalTime(String jsonModal,String cSaleTime){
        String creantime = "";
        JSONObject json = JSONObject.parseObject(jsonModal);
        Date currentDate = new Date();
        switch (cSaleTime) {
            case Constant.CSALEMODAL_TIME_DAY:  //第几天 //的什么什么时间
                String day = json.getString("d");
                String timer = json.getString("t");
                Integer inter = Integer.valueOf(day) - 1; //减 1 为了实现 如果是 往前推一天  比如 第一天 是当天的时间
                Date whatDay = DateUtil.addDays(currentDate,inter);
                creantime = DateUtil.getDateFormat(whatDay,"yyyy-MM-dd")+" "+timer;
                break;
            case Constant.CSALEMODAL_TIME_WEEK:
                String week = json.getString("wc");
                String weekw = json.getString("w");
                String weektimer = json.getString("t");
                Integer interWeek = Integer.valueOf(week) - 1; //减 1 为了实现 如果是 往前推一周时间  比如 一周时间 是当天的时间
                Date whatWeek = DateUtil.addDays(currentDate,interWeek);

                //获取 whatWeek 星期几
                int num= DateUtil.getWeekDay(whatWeek);
                int ChaNum = Integer.valueOf(weekw) - num ; //和后推的周数减少几天
                Date whatWeekFinal = DateUtil.addDays(whatWeek,ChaNum);
                creantime = DateUtil.getDateFormat(whatWeekFinal,"yyyy-MM-dd")+" "+weektimer;
                break;
            case Constant.CSALEMODAL_TIME_MONTH:
                String month = json.getString("mc");
                String monthw = json.getString("md");
                String monthtimer = json.getString("t");

                Integer interMonth = Integer.valueOf(month) - 1; //减 1 为了实现 如果是 往前推一月时间  比如 一月时间 是当天的时间
                Date whatMonth = DateUtil.addDays(currentDate,interMonth);

                //获取 whatWeek 星期几
                int numMon= DateUtil.getDay(whatMonth);
                int ChaNummom = Integer.valueOf(monthw) - numMon ; //和后推的月数减少几天
                Date whatmonthFinal = DateUtil.addDays(whatMonth,ChaNummom);
                creantime = DateUtil.getDateFormat(whatmonthFinal,"yyyy-MM-dd")+" "+monthtimer;

                break;
            case Constant.CSALEMODAL_TIME_HOUR:
                String hour = json.getString("h");
                int numHour = Integer.valueOf(hour);
                Date whatHour = DateUtil.addHours(currentDate,numHour);
                creantime = DateUtil.getDateFormat(whatHour,"yyyy-MM-dd HH:mm:ss");
                break;
            default:
                String tim = json.getString("t");
                creantime = tim;
        }
        return creantime;
    }
}



